package com.itheima.d12_extends_override;

import java.util.ArrayList;


/**
 *什么是方法重写？
 * 当子类觉得父类中的某个方法不好用，或者无法满足自己的需求时，子类可以重写一个方法名称、参数列表一样的方法，去覆盖父类的这个方法，这就是方法重写。
 * 注意：重写后，方法的访问，Java会遵循就近原则 。
 *
 *方法重写的其它注意事项
 *  重写小技巧：使用Override注解，他可以指定java编译器，检查我们方法重写的格式是否正确，代码可读性也会更好。
 * 子类重写父类方法时，访问权限必须大于或者等于父类该方法的权限（ public > protected > 缺省 ）。
 * 重写的方法返回值类型，必须与被重写方法的返回值类型一样，或者范围更小。
 * 私有方法、静态方法不能被重写，如果重写会报错的。
 */

/**
 * 方法重写是什么?
 * 子类写了一个方法名称，形参列表与父类某个方法一样的方法去覆盖父类的该方法。
 * 重写方法有哪些注意事项？
 * 建议加上：@Override注解，可以校验重写是否正确，同时可读性好。
 * 子类重写父类方法时，访问权限必须大于或者等于父类被重写的方法的权限。
 * 重写的方法返回值类型，必须与被重写方法的返回值类型一样，或者范围更小。
 * 私有方法、静态方法不能被重写。
 * 方法重写有啥应用场景？
 * 当子类觉得父类的方法不好用，或者不满足自己的需求时，就可以用方法重写。
 *
 * 关于这些注意事项，同学们其实只需要了解一下就可以了。
 * 实际上我们实际写代码时，只要和父类写的一样就可以（ 总结起来就8个字：**声明不变，重新实现**）
 */
public class Test {
    public static void main(String[] args) {
        // 目标：认识方法重写，掌握方法重写的常见应用场景。
        B b =  new B();
        b.print1();
        b.print2(2, 3);

        System.out.println("------------------------");
        Student s = new Student("播妞", 19);
        // System.out.println(s.toString());   //加个tostring是多此一举
        //我TM这个地址值和黑马里面案例生成的地址值一样 3b07d329。哈哈哈
        //不重写ToString方法输出的s就是在堆内存的十六进制地址com.itheima.d12_extends_override.Student@3b07d329
        //重写之后才能输出内容
        System.out.println(s);

        ArrayList list = new ArrayList();
        list.add("java");
        System.out.println(list);
    }
}
